package br.unicamp.ic.sgct.server.dominio.entidades;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;


import br.unicamp.ic.sgct.client.dominio.to.PreletorTO;
import br.unicamp.ic.sgct.client.dominio.to.UsuarioTO;
import javax.persistence.DiscriminatorValue;
 /**
     * @OneToMany
     * um preletor pode ter vários trabalhos e um trabalho pode ter um preletor
     *
     * A entity Trabalho tem um atributo chamado "preletor" o qual está mapeado há
     * uma coluna da tabela da entity Trabalho (T_TRABALHO) cujos valores representam
     * chaves estrangeiras (FOREIGN KEY) dos registros da tabela da entity Preletor
     * (T_PRELETOR). Como não é obrigatório que esta coluna
     * tenha valor (nullable = false), então pode haver ou não
     * T_TRABALHO.id_preletor = T_PRELETOR.id_preletor,
     *
     */
@SuppressWarnings("serial")
@Entity(name = "Preletor")
@DiscriminatorValue(value = "preletor")
public class Preletor extends Usuario {

    @Column(length = 30)
    private String instituicao;
   
    @OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, mappedBy = "preletor")
    private List<Trabalho> trabalhos;

    public List<Trabalho> getTrabalhos() {
        return trabalhos;
    }

    public void setTrabalhos(List<Trabalho> trabalhos) {
        this.trabalhos = trabalhos;
    }

    public Preletor() {
        super();
    }

    public Preletor(PreletorTO to) {
        super(to);
    }

    /**
     *
     * @param instituicao
     * @param trabalho
     */
    public Preletor(String instituicao, List<Trabalho> trabalhos, Usuario usuario) {
        this.instituicao = instituicao;
        this.trabalhos = trabalhos;
    }

    public String getInstituicao() {
        return instituicao;
    }

    public void setInstituicao(String instituicao) {
        this.instituicao = instituicao;
    }

    /**
     * Constructs a <code>String</code> with all attributes
     * in name = value format.
     *
     * @return a <code>String</code> representation
     * of this object.
     */
    public String toString() {
        final String TAB = "    ";

        String retValue = "";

        retValue = "Preletor ( "
                + super.toString() + TAB
                //+ "id = " + this.id + TAB
                + "instituicao = " + this.instituicao + TAB
                + "trabalhos = " + (this.trabalhos != null ? this.trabalhos.toString() + TAB : "NULL ")
                + " )";

        return retValue;
    }

    /**
     * Se este método tiver o nome getTO() dará erro. Por quê?
     */
    public PreletorTO getPreletorTO() {
        PreletorTO to = new PreletorTO();
        super.populaTO(to);
        return to;
    }
    
    @Override
    public UsuarioTO getTo() {
        PreletorTO to = new PreletorTO();
        super.populaTO(to);
        return to;
    }


}
